//
//  CZStatusListViewModel.swift
//  Weibo24
//
//  Created by apple on 16/3/1.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
import AFNetworking

class CZStatusListViewModel: NSObject {

    //定义成员变量,来接收数据
    lazy var array: [CZStatusViewModel] = [CZStatusViewModel]()
    
    //MARK:--网络请求
    func loadData(since_id: Int,max_id: Int,finish: (count: Int)->()){
        
      /*
            1. 优先去从数据库加载,如果数据里没有符合条件的数据的话
            2. 再请求网络
        */
        // 数据库加载
        selectStatus(since_id, max_id: max_id) { (dbList) -> () in
            
            // 我们判断一下 dbList.count
            if dbList.count > 0 {
                // 先显示我们的数据
                
              let count =  self.pareseArray(dbList, max_id: max_id)
                
                // 进行回调 ,
                // 从数据库读取的数据,不需要提示
                //
                finish(count: -1)
                
                
            } else {
                //进行网络请求
                self.NetLoadData(since_id, max_id: max_id, finish: finish)
            }
            
        }
        
    }
    
    //MARK:--网络请求
    func NetLoadData(since_id: Int,max_id: Int,finish: (count: Int)->()){
        
        // 创建一个网络请求实例
        let afn = AFHTTPSessionManager()
        
        // 拼接参数
        /*
        必选	类型及范围	说明
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
        count	false	int	单页返回的记录条数，最大不超过100，默认为20。
        */
        let params = ["access_token":CZUserViewModel.shareInstance.access_token ?? "",
            "max_id":max_id,
            "since_id":since_id]
        
        // 发送请求
        afn.GET("https://api.weibo.com/2/statuses/home_timeline.json", parameters: params, progress: nil, success: { (_ , JSON) -> Void in
            printLog(JSON)
            
            //获取statuess数据
            // 字典转模型 -> KVC
            
            if let json = JSON as? [String: NSObject]{
                
                // 千万不要手写 statuses
                if let statues = json["statuses"] as? [[String: NSObject]]{
                    
                    // MARK:-- 数据库插入数据
                    self.insertStatus(statues)
                    
                    //调用刚才的方法
                   let count = self.pareseArray(statues, max_id: max_id)
                    
                
                    // 刷新UI
                    finish(count: count)
                    //                        self.tableView.reloadData()
                    
                }
                
            }
            
            }) { (_ , error) -> Void in
                print(error)
        }
        
    }

    
    func pareseArray(statues: [[String: NSObject]],max_id: Int) ->Int{
    
        // 定义一个临时的数组
        var temp = [CZStatusViewModel]()
        // 对数组进行便利
        for statue in statues {
            
            let statusModel = CZStatusModel(dic: statue)
            
            printLog(statusModel.id)
            
            //添加到数组里
            // 我们把 Model赋值放置在 ViewModel里
            let viewModel = CZStatusViewModel()
            viewModel.statusModel = statusModel
            
            
            temp.append(viewModel)
            
            
        }
        
        
        /*
        对数据进行拼接
        怎么才能知道是 上拉更多的数据
        */
        
        if max_id > 0 {
            // 是不是上拉更多的数据
            self.array = self.array + temp
        } else {
            // temp为最新数据,所以我们需要把新数据放置在前边
            self.array = temp + self.array
            //                        self.array = self.array + temp
            
        }

        // 现在 我们需要 一个 count
        return temp.count

    }
    
    // 数据插入数据
    func insertStatus(statues: [[String: NSObject]]) {
    
        CZDBManager.shareInstance.queue?.inDatabase({ (db) -> Void in
            
            // INSERT INTO T_status (status,statusid,userid) VALUES ('test','001','001');
            //遍历去获取参数
            for status in statues {
            
                var statusData: NSData = NSData()
                // 把字典转换成 data
                if let data = try? NSJSONSerialization.dataWithJSONObject(status, options: []){
                    statusData = data
                }
                
                // 注意,我用的强转,因为不强制的画,有 Otional()
                let statusid = status["idstr"] as! String
                // 去组织参数
                // 用 ? 来代替传入的参数
                let sql = "INSERT INTO T_status (status,statusid,userid) VALUES (?,?,?);"
                // 注意参数的顺序
                if  db.executeUpdate(sql, withArgumentsInArray: [statusData,statusid,CZUserViewModel.shareInstance.model!.uid!]) {
                
                    print("插入成功")
                    
                } else {
                    print("插入失败")
                }
                
                
            }
            
            
        })
        
    }
    
    //数据库查询数据
    func selectStatus(since_id: Int,max_id: Int,finish: (array: [[String: NSObject]])->()) {
    
        CZDBManager.shareInstance.queue?.inDatabase({ (db) -> Void in
        //sql语句的结束标志是 ;
            var sql = "SELECT status FROM T_status WHERE userid = '\(CZUserViewModel.shareInstance.model!.uid!)'"
            
            // \n 的目的就是为了换行,防止sql 合并,造成sql语句错误 SELECT status FROM T_status WHERE userid = '5829345367'AND statusid < 3951520852488896ORDER BY statusid DESC LIMIT 20 ;
            
            // 拼接sql语句
            if since_id > 0 {
              sql +=  "\nAND statusid > \(since_id)"
            } else if max_id > 0 {
                sql += "\nAND statusid < \(max_id)"
            }
            // 按照 statusid 降序排列 ->ORDER BY statusid DESC
            // 返回20条数据 -> LIMIT 20
            sql += "\nORDER BY statusid DESC LIMIT 20 ;"
            //一定要打印
            print(sql)
            
            //  executeQuery 查询语句
            let rs = db.executeQuery(sql, withArgumentsInArray: [])
            
            // 创建一个 数组
            var statues = [[String: NSObject]]()
            // 读取集合
            while rs.next() {
            
                //获取
              let status = rs.stringForColumn("status")
                
                // 把字符串转换成字典
                
                // 1.把字符串转换成了 data
                let data = status.dataUsingEncoding(NSUTF8StringEncoding)
                // 2. 把 data转换成 字典
                if let Odata = data{
                
                    // ??
                    let dic = try? NSJSONSerialization.JSONObjectWithData(Odata, options: [])
                    
                   // 把读取的字典添加到数组里
                    if let Odic = dic as? [String: NSObject] {
                    
                        statues.append(Odic)
                    }
                }
                
            }
            
            // 拼接好了之后,回调
            finish(array: statues)
        })
        
    }
}
